<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // async函数返回一个Promise对象
    async function f(){
        throw new Error("出错了")
    }
    f().then( v => console.log(v))
    .catch( e => console.log(e))

    // async函数返回一个Promise对象
    // async函数内部return语句返回的值会成为then方法回调函数的参数
    async function test(){
        await "呱呱呱";
        // async函数返回的Promise对象 必须等到内部所有await命令后面的Promise对象执行完
        // 才会发生状态改变 
        // 除非遇到return 语句或者抛出错误 才会执行then方法指定的回调函数
        return "汪汪汪"
        await "喵喵喵 "
    }
    test().then( v => console.log("异步操作结束啦" + v))
    .catch(e => console.log(e))
    

    //1.await命令后面是一个Promise对象 返回该对象的结果
    //2.如果不是Promise对象 就直接返回对应的值
    //3.await命令后面是一个定义了then方法的对象 那么await会将其等同于Promise对象
    class Sleep{
        constructor(timeout){
            this.timeout = timeout;
        }
        then(resolve,reject){
            const startTime = Date.now();
            setTimeout(
                ()=>resolve(Date.now() - startTime),
                this.timeout
            )
        }
    }
   (async()=>{
      const sleepTime = await new Sleep(1000);
      console.log(sleepTime) 
   })()
  
  //借助await命令让程序休眠指定的时间
   function sleep(sleeptime){
       return new Promise(resolve =>{
           setTimeout(resolve,sleeptime)
       })
   }
   async function TestSleep(){
       for(let  i = 0; i < 5 ;i++){
           console.log(i);
           await sleep(1000)
       }
   }
   TestSleep();
   


</script>
</html>